/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Cliente;

import AdminClienten.AdminOp;
import Cliente.web.WebArquivo;
import cliente.auxiliar.Envia;
import cliente.rmi_aux.RMInterface;
import cliente.auxiliar.Conexao;
import cliente.ClienteRMI;
import common.*;
import java.rmi.RemoteException;
import java.rmi.RMISecurityManager;
import webRMI.WebEnvia;
import webRMI.WebGereOperacoes;
import webRMI.WebRMIRecebeTweets;
/**
 *
 * @author ziza
 */
public class WebGestor {

    private Conexao ligacao = null;
    private Envia send = null;
    private RMInterface rmi_liga = null;
    private WebGereOperacoes gestor = null;
    private WebArquivo arquivo = null;
    private WebRMIRecebeTweets rmi_recebe=null;
    private AdminOp gereAdmin = null;

    public WebGestor() throws RemoteException{

        System.getProperties().put("java.security.policy", "policy.all");
        System.setSecurityManager(new RMISecurityManager());

        System.out.println("Estou a criar o objecto");
        ligacao = new Conexao(ClienteRMI.mainHost, ClienteRMI.mainPort);
        gestor = new WebGereOperacoes();
        rmi_liga = new RMInterface(gestor);
        
            /*
             * O bode
             *
             */
        try {
            rmi_recebe = new WebRMIRecebeTweets(gestor);
        } catch (RemoteException ex) {
            System.out.println("O Bode de mandar o objecto como seria de esperar!\n"+ex.getMessage());
        }

        send = new WebEnvia(ligacao, gestor);
        arquivo = new WebArquivo();
        this.gestor.setConexao(ligacao);
        this.gestor.setEnvia(send);
        this.gestor.setInter(rmi_liga);
        this.gestor.setArquivador(arquivo);
        gestor.setRecTwe(rmi_recebe);
        
        //this.gestor.setWebInterface(true);
        send.start();
        this.iniciaLigacao();
    }

    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Get
    public WebArquivo getArquivo() {
        return arquivo;
    }

    public void setArquivo(WebArquivo arquivo) {
        this.arquivo = arquivo;
    }

    public WebGereOperacoes getGestor() {
        return gestor;
    }

    public void setGestor(WebGereOperacoes gestor) {
        this.gestor = gestor;
    }

    public Conexao getLigacao() {
        return ligacao;
    }

    public AdminOp getGereAdmin() {
        return gereAdmin;
    }

    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Set
    public void setLigacao(Conexao ligacao) {
        this.ligacao = ligacao;
    }

    public RMInterface getRmi_liga() {
        return rmi_liga;
    }

    public void setRmi_liga(RMInterface rmi_liga) {
        this.rmi_liga = rmi_liga;
    }

    public Envia getSend() {
        return send;
    }

    public void setSend(Envia send) {
        this.send = send;
    }

    public void setGereAdmin(AdminOp gereAdmin) {
        this.gereAdmin = gereAdmin;
    }

    public void iniciaLigacao() {

        int resultado = ligacao.conexao_RMI();
        if (resultado == 0) {
            System.out.println("Ligacao estabelecida com sucesso.");
        } else {
            System.out.println("Problemas no estabelecimento da ligacao.");
        }
    }

    

    /*
     * -------------------------------------------------------
     *          Efectuar as diferentes operacoes
     * -------------------------------------------------------
     */
    public void efectuaLogin(String nickname, String pass) {

        rmi_recebe.setWebGestor(gestor);
        OpLogin log = new OpLogin(nickname, pass, "login");
        gestor.getEnvia().setArrayList(log);

        Menssagem resposta = arquivo.getLogin();

        if (resposta != null) {
            arquivo.setNickname(nickname);
            if(arquivo.getNickname().equalsIgnoreCase("admin")){
                gereAdmin = new AdminOp(arquivo, gestor, this);
                this.setGereAdmin(gereAdmin);
            }
            arquivo.setLogin(null);
            arquivo.setLoggout(true);
        } else {
            //Caso de erro a resposta
        }
    }

    public void efectuaRegisto(String nick, String pass, String name, String place, String mail) {

//        System.out.println("Ja mandei cenas p o buffer\n"+nick+"#"+pass+"#"+name+"#"+mail+"#"+place);
        OpRegister registo = new OpRegister(nick, pass, name, mail, place, "Register");
        gestor.getEnvia().setArrayList(registo);

        Menssagem resposta = arquivo.getRegisto();

        if (resposta != null) {
            arquivo.setNickname(nick);
            arquivo.setRegisto(null);
        } else {
            //Caso de erro a resposta
        }
    }

    public String[] seeFollowing() {

//        System.out.println("Nome do arquivo:" + arquivo.getNickname());
        OpFollowing following = new OpFollowing(arquivo.getNickname(), "following");
        gestor.getEnvia().setArrayList(following);

        Menssagem resposta = arquivo.getFolloing();

        if(resposta != null){
            String []bufferFollowing = efectuaParse(resposta.getMenssagem(), ":");
            arquivo.setFolloing(null);
            return bufferFollowing;
        }

        else{
            //Em caso de dar bode tratar
            return null;
        }
    }

    public String[] seeFollowers() {

        System.out.println("Nome do arquivo:" + arquivo.getNickname());
        OpFollowers followers = new OpFollowers(arquivo.getNickname(), "Followers");
        gestor.getEnvia().setArrayList(followers);

        Menssagem reposta = arquivo.getFollowers();

        if(reposta != null){
            String []bufferFollowers = efectuaParse(reposta.getMenssagem(), ":");
            arquivo.setFollowers(null);
            return bufferFollowers;
        }

        else{
            //Em caso de dar bode tratar
            return null;
        }
    }

    public String[] seeTwits() {
        Menssagem sms_envia = new Menssagem(arquivo.getNickname(), "Ver mensagens");
        gestor.getEnvia().setArrayList(sms_envia);

        Menssagem resposta = arquivo.getSeeTweet();

        if(resposta != null){
            String []bufferSms = efectuaParse(resposta.getMenssagem(), "#");
            arquivo.setSeeTweet(null);
            return bufferSms;
        }

        else{
            //Em caso de dar bode tratar
            return null;
        }
    }

    public void doTweet(String tweet) {

        if ((tweet.length() <= 140) && (tweet.length() > 0)) {
            System.out.println("Mensagem Tweet:"+tweet);
            Menssagem sms_envia = new Menssagem(arquivo.getNickname(), "Tweet:" + tweet);
            gestor.getEnvia().setArrayList(sms_envia);
            System.out.println("Mensagem enviada!!!");
        }
    }

    public String[] searchUsers(String searchString) {
        System.out.println("A pesquisar:" + arquivo.getNickname());
        OpSearch search = new OpSearch(arquivo.getNickname(), searchString, "search");
        gestor.getEnvia().setArrayList(search);

        Menssagem resposta = arquivo.getSearch();

        if(resposta != null){
            String []bufferSeach = efectuaParse(resposta.getMenssagem(), ":");
            arquivo.setSearch(null);
            return bufferSeach;
        }

        else{
            //Em caso de dar bode tratar
            return null;
        }
    }

    public void doFollow(String user) {
        OpFollow follow = new OpFollow(arquivo.getNickname(), user, "Segue");
        gestor.getEnvia().setArrayList(follow);
    }

    public String[] getDetails(String user) {

        OpDetails details = new OpDetails(arquivo.getNickname(), user, "Detalhes");
        gestor.getEnvia().setArrayList(details);

        Menssagem resposta = arquivo.getDetails();

        if(resposta!=null){
            System.out.println("Os detalhes recebidos:"+resposta.getMenssagem());
            String []bufferDetalhes = efectuaParse(resposta.getMenssagem(), ":");
            arquivo.setDetails(null);
            return bufferDetalhes;
        }
        else{
            //Em cado de erro falta tratar
            return null;
        }
    }

    public void logOut() {
        if (gestor.getConexao().getEstado().equalsIgnoreCase("Ligado")) {
            Menssagem sms_envia = new Menssagem(arquivo.getNickname(), "Loggout");
            gestor.getEnvia().setArrayList(sms_envia);

            if(arquivo.getLoggout()==false){
                System.out.println("Loggout efectuado com sucesso...");
                gestor.getConexao().setEstado("Off");
            }
        }
    }

    public String [] instTwitt(){

        if (arquivo.isAlterado()==false){
            return null;
        }
        else{
            Menssagem ret = arquivo.getBufferMenssagems();
            arquivo.setBufferMenssagems(null);
            arquivo.setAlterado(false);
            String [] pimba = efectuaParse(ret.getMenssagem(), ":");
            return pimba;
        }
    }

    public boolean tenhe(){
        return(arquivo.isAlterado());
    }

    /*
     * --------------------------------------------------
     *      Metodos auxiliares
     * --------------------------------------------------
     */

    public boolean isLog() {
        if (arquivo.getLoggout()==true) {
            return true;
        }
        return false;
    }

    public String[] efectuaParse(String mensagem, String separa) {

        mensagem = mensagem.trim();
        String[] parse = mensagem.split(separa);
        return parse;
    }
}
